package com.itheima.day16.task1;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/*
* 分析以下需求,并用代码实现
	1.已知一个类，定义如下：
		package com.itheima;
		public class DemoClass {
			private void run(String name) {
				System.out.println(nam + "welcome to heima!");
			}
		}
		(1)写一个Properties格式的配置文件，配置类的完整名称、方法名称
		(2)写一个程序，读取这个Properties配置文件，获得类的完整名称并加载这个类，
		(3)用反射 的方式创建对象、获取方法、执行方法
* */
public class Demo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        ClassLoader classLoader = Demo2.class.getClassLoader();
        InputStream resourceAsStream = classLoader.getResourceAsStream("pro1.properties");
        Properties p=new Properties();
        p.load(resourceAsStream);
        resourceAsStream.close();
//获取对象
        String className1 = p.getProperty("className1");
        Class<?> aClass = Class.forName(className1);
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();
        declaredConstructor.setAccessible(true);
        Object o = declaredConstructor.newInstance();
        //获取字段
        Field filedName1 = aClass.getDeclaredField(p.getProperty("filedName"));
        filedName1.setAccessible(true);
        filedName1.set(o,"小强 ");

    //    System.out.println(filedName1.get(o));
        //获取方法
        Method methodName1 = aClass.getDeclaredMethod(p.getProperty("methodName"),String.class);
        methodName1.setAccessible(true);
        methodName1.invoke(o,filedName1.get(o));

    }
}
